﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using JasRibbonApplicatie.Classes;
using System.Threading;
using JasRibbonApplicatie.Controllers;
using System.Media;
using JasRibbonApplicatie.Model;

namespace JasRibbonApplicatie.Views
{
	public partial class OntleningenView : Page
	{
		public const String STARTEN_TEXT = "Scannen starten";
		public const String STOPPEN_TEXT = "Scannen stoppen";
		// statussen voor de GUI (niet voor de DB!!!)

		public const int STATUS_AFHALING = 1;
		public const int STATUS_INLEVERING = 2;

		
		private Aanvraag huidigeAanvraag;
		private Magazijnier huidigeMagazijnier;



		private OntleningBeheerderBackup ontleningBeheerder;
		private int status;
        private MainWindow mainPageRef;
		//private Stack<String> undoStack;

		private SoundPlayer succesNotificationPlayer;
		private SoundPlayer failedNotificationPlayer;

        private static GebruikerModel gm = new GebruikerModel();
        private static AanvraagModel am = new AanvraagModel();

		public OntleningenView()
		{
			using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait))
			{
				InitializeComponent();

                #region init geluidjes
                // property Build Action van sound-files moet Resource zijn
				var uriSucces = new Uri("/Resources/Mail.wav", UriKind.RelativeOrAbsolute);
				var streamSucces = Application.GetResourceStream(uriSucces).Stream;
				succesNotificationPlayer = new SoundPlayer(streamSucces);
				var uriFailed = new Uri("/Resources/KDE_Notify.wav", UriKind.RelativeOrAbsolute);
				var streamFailed = Application.GetResourceStream(uriFailed).Stream;
				failedNotificationPlayer = new SoundPlayer(streamFailed);
                #endregion

				// beheerknop instellen
				mainPageRef.btnOntleningBeheer.Label = STARTEN_TEXT;
				mainPageRef.btnOntleningBeheer.IsEnabled = false;
				mainPageRef.btnOngendaanMaken.IsEnabled = false;
				disableScanActies();
				huidigeAanvraag = null;
				ontleningBeheerder = null;
				//undoStack = new Stack<string>();
				probleemGroupbox.Visibility = Visibility.Hidden;
			}
		}

		public void ontleningBeherenButton_Click()
		{
			if (mainPageRef.btnOntleningBeheer.Label.Equals(STARTEN_TEXT))
			{
				using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait))
				{
					mainPageRef.btnOntleningBeheer.Label = STOPPEN_TEXT;
					enableScanActies(); // worden alle overig controls gedisabled!!!
					uitscannenMaterialenCanvas.IsEnabled = true;
					uitlegScannenLabel.IsEnabled = true;
					ontleningBeheerder = new OntleningBeheerderBackup(huidigeAanvraag, huidigeMagazijnier);
					materialenDataGrid.ItemsSource = ontleningBeheerder.OntleningDataMaterialen;
					toebehorenDataGrid.ItemsSource = ontleningBeheerder.OntleningDataToebehoren;
					//materialenDataGrid.DataContext = ontleningBeheerder.OntleningDataMaterialen;
					scanTextBox.IsEnabled = true;
					laatstGescandTextBox.Text = "";
					statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/info.png") as ImageSource;

				}
				scanTextBox.Focus();
			}
			else if (mainPageRef.btnOntleningBeheer.Label.Equals(STOPPEN_TEXT))
			{
				am.OpslaanWijzigingen();
				// nog controleren of alle producten uit de aanvraag ingescand zijn
				// => binnenkort nog een extra MessageBox, maar ontlening-acties worden nu dan gewoon naar
				//    database geschreven als de gebruiker op STOPPEN klikt...
				// factuur afdrukken vóórdat afsluiten toegelaten wordt.
				// => wordt binnenkort geïmplementeerd....
				mainPageRef.btnOntleningBeheer.Label = STARTEN_TEXT;
				disableScanActies();
				uitscannenMaterialenCanvas.IsEnabled = false;
				uitlegScannenLabel.IsEnabled = false;
				scanTextBox.Text = "";
				scanTextBox.IsEnabled = false;
				huidigeAanvraag = null;
				mainPageRef.btnOntleningBeheer.IsEnabled = false;
				mainPageRef.btnOngendaanMaken.IsEnabled = false;
				//undoStack.Clear();
			}
		}

		private void scanTextBox_TextChanged(object sender, TextChangedEventArgs e)
		{
			TextBox textbox = (TextBox)sender;
			String inhoud = textbox.Text.ToLower();

			if (inhoud.Length == MateriaalModel.LENGTH_SCANCODES)
			{
				// invoer niet meer toelaten (proces kan tijdje duren)
				// gebruiker kan en mag terwijl niets doen...

				//is threading/tasks geen bruikbare oplossing? (Johan)
				// => ik laat een wachtcursor tonen; volgens mij kan de gebruiker terwijl toch niets doen (of denk je dat
				//    dat dan allemaal op de achtergrond kan verlopen; wat dan als de gebruiker 10 dingen snel achter elkaar
				//    inscant; wordt het dan instabiel of niet? (threading)

				textbox.IsEnabled = false;
				laatstGescandTextBox.Text = inhoud;				
				try
				{
					bool toegevoegd = false;
					using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait)) // wachtcursor tonen
					{
						if (status == STATUS_AFHALING)
						{
							toegevoegd = ontleningBeheerder.OntleningToevoegen(inhoud);
						}
						else if (status == STATUS_INLEVERING)
						{
							toegevoegd = ontleningBeheerder.OntleningBeeindigen(inhoud);
						}
					}
					if (toegevoegd)
					{
						succesNotificationPlayer.Play();
						probleemGroupbox.Visibility = Visibility.Hidden;
						statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/vinkjeGroen.png") as ImageSource;
						//undoStack.Push(inhoud);
						mainPageRef.btnOngendaanMaken.IsEnabled = true;
						materialenDataGrid.Items.Refresh();
						toebehorenDataGrid.Items.Refresh();
					}
					else
					{
						// geluid gespeeld in notifyProblem
						statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/gevarendriehoek1.png") as ImageSource;
						notifyProblem("Dit product kan niet uitgeleend worden voor deze aanvraag!",
							(new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/verbodsbord2.png") as ImageSource));
					}
				}
				catch (ArgumentException aex)
				{
					// geluid gespeeld in notifyProblem
					statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/gevarendriehoek1.png") as ImageSource;
					notifyProblem("Probleem: " + aex.Message,
						(new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/close.png") as ImageSource));

				}

				textbox.Text = "";
				textbox.IsEnabled = true;
				textbox.Focus(); // zodat je terug iets kunt inscannen
			}
		}

		private void notifyProblem(String probleem, ImageSource afbeeldingsbron)
		{
			probleemGroupbox.Visibility = Visibility.Visible;
			probleemImage.Source = afbeeldingsbron;
			probleemTextBox.Text = probleem;
			failedNotificationPlayer.Play();
		}

		private void disableScanActies()
		{
			//mainPageRef.btnOngendaanMaken.IsEnabled = false;
			mainPageRef.btnOngendaanMaken.IsEnabled = false;
			mainPageRef.materiaalTab.IsEnabled = true;
			mainPageRef.aanvragenTab.IsEnabled = true;
			mainPageRef.gebruikersTab.IsEnabled = true;
			mainPageRef.ScannenGroup.IsEnabled = true;
			mainPageRef.planningTab.IsEnabled = true;
			mainPageRef.Logoff.IsEnabled = true;
            mainPageRef.CloseButton.IsEnabled = true;
		}

		private void enableScanActies()
		{
			mainPageRef.btnOngendaanMaken.IsEnabled = true;
			mainPageRef.materiaalTab.IsEnabled = false;
			mainPageRef.aanvragenTab.IsEnabled = false;
			mainPageRef.gebruikersTab.IsEnabled = false;
			mainPageRef.ScannenGroup.IsEnabled = false;
			mainPageRef.planningTab.IsEnabled = false;
			mainPageRef.Logoff.IsEnabled = false;
            mainPageRef.CloseButton.IsEnabled = false;
		}
		

		public void undo()
		{
			//if (undoStack.Count > 0)
			//{
			//    Queries.OpslaanWijzigingen();
			//    if (status == STATUS_ONTLENING)
			//    {
			//        // remove laatste ontlening!!!
			//    }
			//    else if (status == STATUS_TERUGBRENGEN)
			//    {
			//        // laatste ontlening: terugbreng datum en magazijnier terug op beginwaarden instellen
			//    }
			//}
			//if (undoStack.Count <= )
			//{
				
			//}
			am.OpslaanWijzigingen();
			String laatsteScanString = laatstGescandTextBox.Text;
			if (status == STATUS_AFHALING)
			{
				ontleningBeheerder.RemoveOntlening(laatsteScanString);
			}
			else if (status == STATUS_INLEVERING)
			{
				ontleningBeheerder.UndoBeeindigingOntlening(laatsteScanString);
			}
			laatstGescandTextBox.Text = null;
			statusImage.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/info.png") as ImageSource;
			am.OpslaanWijzigingen();
			mainPageRef.btnOngendaanMaken.IsEnabled = false;
			materialenDataGrid.Items.Refresh();
			toebehorenDataGrid.Items.Refresh();
		}

        private void button1_Click(object sender, RoutedEventArgs e)
        {

        }
	}
}
